package com.xh.rufongwallpaper.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xh.rufongwallpaper.entity.Wallpaper;
import com.xh.rufongwallpaper.vo.WallpaperVO;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Optional;

/**
 * 壁纸服务接口
 *
 * @author XH
 */
public interface WallpaperService {

    /**
     * 获取壁纸详情
     *
     * @param id 壁纸ID
     * @return 壁纸对象
     */
    Optional<Wallpaper> getWallpaperById(Long id);

    /**
     * 分页获取壁纸列表
     *
     * @param pageIndex 页码(0-based)
     * @param pageSize  每页大小
     * @return 壁纸分页列表
     */
    Page<Wallpaper> getWallpapers(int pageIndex, int pageSize);

    /**
     * 根据分类ID获取壁纸列表
     *
     * @param categoryId 分类ID
     * @param pageIndex  页码(0-based)
     * @param pageSize   每页大小
     * @return 壁纸分页列表
     */
    Page<Wallpaper> getWallpapersByCategory(Long categoryId, int pageIndex, int pageSize);

    /**
     * 根据标签获取壁纸列表
     *
     * @param tag       标签
     * @param pageIndex 页码(0-based)
     * @param pageSize  每页大小
     * @return 壁纸分页列表
     */
    Page<Wallpaper> getWallpapersByTag(String tag, int pageIndex, int pageSize);

    /**
     * 搜索壁纸
     *
     * @param keyword   关键词
     * @param pageIndex 页码(0-based)
     * @param pageSize  每页大小
     * @return 壁纸分页列表
     */
    Page<Wallpaper> searchWallpapers(String keyword, int pageIndex, int pageSize);

    /**
     * 获取热门壁纸
     *
     * @param pageIndex 页码(0-based)
     * @param pageSize  每页大小
     * @return 壁纸分页列表
     */
    Page<Wallpaper> getHotWallpapers(int pageIndex, int pageSize);

    /**
     * 获取最新壁纸
     *
     * @param pageIndex 页码(0-based)
     * @param pageSize  每页大小
     * @return 壁纸分页列表
     */
    Page<Wallpaper> getLatestWallpapers(int pageIndex, int pageSize);
    
    /**
     * 获取趋势壁纸
     *
     * @param pageIndex 页码(0-based)
     * @param pageSize  每页大小
     * @return 壁纸分页列表
     */
    Page<Wallpaper> getTrendingWallpapers(int pageIndex, int pageSize);

    /**
     * 增加壁纸下载次数
     *
     * @param id 壁纸ID
     * @return 是否成功
     */
    boolean incrementDownloadCount(Long id);
    
    /**
     * 获取随机壁纸
     *
     * @param categoryId 分类ID(可选)
     * @return 壁纸对象
     */
    Wallpaper getRandomWallpaper(Long categoryId);
    
    /**
     * 获取相关壁纸
     *
     * @param wallpaperId 当前壁纸ID
     * @param categoryId  分类ID
     * @param limit       数量限制
     * @return 壁纸列表
     */
    List<Wallpaper> getRelatedWallpapers(Long wallpaperId, Long categoryId, int limit);
    
    /**
     * 统计分类下的壁纸数量
     *
     * @param categoryId 分类ID
     * @return 壁纸数量
     */
    int countWallpapersByCategory(Long categoryId);
    
    /**
     * 检查壁纸是否存在
     *
     * @param id 壁纸ID
     * @return 是否存在
     */
    boolean existsById(Long id);

    /**
     * 上传壁纸
     *
     * @param file        壁纸文件
     * @param title      标题
     * @param description 描述
     * @param categoryId 分类ID
     * @param tags       标签（逗号分隔）
     * @return 上传的壁纸信息
     */
    WallpaperVO uploadWallpaper(MultipartFile file, String title, String description, Long categoryId, String tags);

    /**
     * 获取壁纸文件路径
     *
     * @param id 壁纸ID
     * @return 壁纸文件路径，如果壁纸不存在则返回null
     */
    String getWallpaperFilePath(Long id);

    /**
     * 获取壁纸缩略图文件路径
     *
     * @param id 壁纸ID
     * @return 壁纸缩略图文件路径，如果壁纸不存在则返回null
     */
    String getWallpaperThumbnailPath(Long id);
}